package smallfrench.ui;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.KeyStroke;

/**
 * Actions de bases pour l’édition d'un texte ; Couper / Copier / Coller,
 * sélection de tout le texte, ...
 * @author antoine1023
 *
 */
public class Actions {

	/**
	 * Le composant qui a le focus actuellement, le dernier composant à avoir
	 * eu le focus ou <code>null</code>.
	 */
	private static Selectionnable objetActif;

	/**
	 * @return Le composant qui a le focus actuellement, le dernier composant à avoir
	 * eu le focus ou <code>null</code>.
	 */
	public static Selectionnable getSelectionnableActif() {
		return objetActif;
	}

	/**
	 * 
	 * @param s Le composant qui vient d’avoir le focus.
	 */
	public static void setSelectionnableActif(Selectionnable s) {
		objetActif = s;
	}

	public final static ActionToutSel TOUT_SEL = new ActionToutSel();
	public final static ActionCouper COUPER = new ActionCouper();
	public final static ActionCopier COPIER = new ActionCopier();
	public final static ActionColler COLLER = new ActionColler();

	/**
	 * Action pour sélectionner tout le contenu d'un composant
	 * {@link Selectionnable}.
	 */
	@SuppressWarnings("serial")
	private static class ActionToutSel extends AbstractAction {

		public ActionToutSel() {
			super("Tout sélectionner",
					Ressources.getIcone("edit-select-all"));
			putValue(SHORT_DESCRIPTION, "Sélectionner tout le fichier");
			putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control A"));
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			objetActif.toutSelectionner();
		}
	}

	/**
	 * Action pour couper la sélection d'un composant {@link Editable}.
	 */
	@SuppressWarnings("serial")
	private static class ActionCouper extends AbstractAction {
		public ActionCouper() {
			super("Couper", Ressources.getIcone("edit-cut"));
			putValue(SHORT_DESCRIPTION, "Couper la sélection");
			putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control X"));
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			if (objetActif instanceof Editable) {
				Editable ed = (Editable) objetActif;
				ed.couper();
			}
		}
	}

	/**
	 * Action pour copier la sélection d’un composant {@link Selectionnable}.
	 */
	@SuppressWarnings("serial")
	private static class ActionCopier extends AbstractAction {
		public ActionCopier() {
			super("Copier", Ressources.getIcone("edit-copy"));
			putValue(SHORT_DESCRIPTION, "Copier la sélection");
			putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control C"));
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			objetActif.copier();
		}
	}

	/**
	 * Action pour coller la sélection d’un composant {@link Editable}.
	 */
	@SuppressWarnings("serial")
	private static class ActionColler extends AbstractAction {
		public ActionColler() {
			super("Coller", Ressources.getIcone("edit-paste"));
			putValue(SHORT_DESCRIPTION, "Coller le contenu du presse-papier");
			putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control V"));
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			if (objetActif instanceof Editable) {
				Editable ed = (Editable) objetActif;
				ed.coller();
			}
		}
	}
}
